package org.example.IO;

import java.io.*;

/**
 * @className: Demo7
 * @author: 芃
 * @description: 文件的读取(字符流)
 * @date: 2024/5/6 16:24
 */
public class Demo7 {
    //1、字符流和字节流
    //1.1 字符流：Reader、Writer （对应着文本文件）每次读写的最小单位是“字符”（一个字符可能对应多个字符）GBK，一个中文字符-》2个字节 UTF8，一个中文字符-》3个字节
    //    字符流能够自动帮我们把文件中及格相邻的字节，转换成以一个字符
    //1.2 字节流：InputStream、OutputStream （对应着二进制文件）每次读写的最小单位是字节（8bit）
    public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("D:\\My_Code\\Java_Code\\EE_And_System_New\\Test\\src\\main\\java\\org\\example\\IO\\test.txt");//创建reader对象的过程就是在打开文件的过程
/*        //无参read()：一次读取一个字符
        while(true){
            int c = reader.read();//返回值类型是int，需要强制类型转换为char
            // 判断是否到达文件末尾
            if (c == -1){
                break;
            }else{
                System.out.println((char)c);
            }
        }*/

        //一次读取若干个字符
        //一个参数read():一次读取若干个字符，会把参数指定的cbuf数组给填充满
        try{
            while(true){
                char[] arr = new char[3];//会尽可能的把arr数组填充满,如果填不满，下次读取继续接着上次读取的位置开始读
                int ret = reader.read(arr);//先将文件中的数据全部读取到arr当中，返回的是读取到的字符个数 步骤①
                // 判断是否到达文件末尾
                if (ret == -1){//首次读取完返回的是读取到的字符个数，第二次读取完返回的是-1
                    break;
                }
                System.out.println("ret = " + ret);
                for (int i = 0; i < ret; i++) {//打印字符，步骤②
                    System.out.println(arr[i]);
                }
            }
            //TODO 三个参数read():一次读取若干个字符，会把参数指定的cbuf数组中的off这个位置开始，到len这么长的范围尽可能的填满
        }finally{
            //一个文件使用完了，要记得 close！！
            reader.close();
        }
    }
}
